﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.Tasks
{
    public static class SemaphoreSlim1
    {

        static SemaphoreSlim _semaphore = new SemaphoreSlim(3); // 初始并发量：3
        private static readonly object _lockObject = new object();

        public static async Task SemaphoreSlim001()
        {
            var tasks = new Task[10];
            for (int i = 0; i < 10; i++)
            {

                tasks[i] = Task.Run(() => ProcessResourceAsync($"任务{i}"));

            }


            await Task.WhenAll(tasks);
            _semaphore.Dispose(); // 释放资源
        }

        static async Task ProcessResourceAsync(string taskName)
        {
            Console.WriteLine($"{taskName} 等待获取信号量...");

            //if (_semaphore.Wait(3000)) // 等待3秒
            // 使用异步等待并获取是否成功的结果
            bool acquired = await _semaphore.WaitAsync(3000); // 等待3秒

            if (acquired) // 只有获取成功才需要释放
            {
                // 1. 信号量获取成功分支
                try
                {
                    Console.WriteLine($"{taskName} 开始处理（当前信号量: {_semaphore.CurrentCount}）");
                    // 关键点：CurrentCount 显示当前可用信号量数量（获取后已减1）

                    await Task.Delay(2000); // 模拟耗时操作
                                            // 异步等待2秒，期间线程不会阻塞（适用于I/O密集型操作）
                }
                finally
                {
                    // 2. 必须释放信号量（确保异常时仍释放）
                    _semaphore.Release();
                    // 关键点：无论try是否成功，finally保证释放信号量
                    // 释放后 CurrentCount 会+1，允许其他等待任务继续执行

                    Console.WriteLine($"{taskName} 释放信号量（剩余: {_semaphore.CurrentCount}）");
                }
            }
            else
            {
                // 3. 信号量获取失败分支（超时）
                Console.WriteLine($"{taskName} 获取信号量超时");
                // 关键点：3秒内未获取到信号量，执行备用逻辑
            }
        }
    }
}

